#include <iostream>
using namespace std;

/*
    运算符重载：拓展运算符作用范围的一种语法机制
        本质：定义一个函数，去实现运算符功能的拓展
        语法规则：返回值类型 operator运算符号(参数列表){}

    经验技巧：
        1.如何确定返回值和形参类型个数
            将人类熟悉的运算表达式转换成函数调用

    运算符重载的两种形式：大部分情况两种形式都可以实现
        1.重载成类的成员函数

        2.重载成普通函数(友元函数、非成员函数)
            不能通过成员对象调用的 --> 只能重载成普通函数
            例子：6+c1
    双目运算符：左边的作为当前对象，右边的作为参数
    以下运算符不可以重载：?:  :: . sizeof
*/


class Cat
{
public:
    Cat(int age, string name)
    {
        this->age = age;
        this->name = name;
    }
    int operator+(Cat &other)
    {
        return this->age + other.age;
    }

private:
    int age;
    string name;
};

int main()
{
    Cat c1(12, "旺财");
    Cat c2(13, "来福");

    // 写法一：符合人类的表达式
    // int result = c1 + c2 ;
    // 写法二：函数调用
    int result = c1.operator+(c2);

    cout << "c1 + c2 = " << result << endl;

    return 0;
}
